home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 001a / com_and4.zip / CACMP.DOC < prev    next >
Text File  |  1990-10-08  |  20KB  |  880 lines

  1. COM-AND Script Utility
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.           ---------------------------------------
  18.                COM-AND Script Utility
  19.           Script utility for the COM-AND language
  20.           ---------------------------------------
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.     CACMP and COM-AND are distributed freely and may be copied by
  33.     anyone for any number of machines, for purposes of evaluation.
  34.     The author offers COM-AND and its accessory programs together
  35.     as "shareware".  If you USE the program a registration of
  36.     $35.00 is required.  The author may be reached:
  37.  
  38.  
  39.                  CABER Software
  40.                  R. (Scott) McGinnis
  41.                  P.O. Box 3607 Mdse Mart
  42.                  Chicago, IL 60654-0607
  43.  
  44.                  PLINK, GEnie id: TARTAN
  45.                  CIS id: 73147,2665
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54. Version 1.0 : 901008
  55.  
  56. COM-AND Script Utility
  57.  
  58.  
  59.                  Table of Contents
  60.                  -----------------
  61.  
  62. I.    Introduction  .............................................. page 1
  63.  
  64. II.    Running CACMP  ............................................. page 2
  65.  
  66. III.    CACMP functions ............................................ page 4
  67.  
  68.     A. Syntax check ............................................ page 4
  69.     B. Semantic check .......................................... page 5
  70.     C. Partial strip ........................................... page 9
  71.     D. Full strip .............................................. page 10
  72.     E. Preprocessing ........................................... page 11
  73.  
  74.  
  75. IV.    CACMP and COM-AND .......................................... page 12
  76.  
  77. V.    Program Requirements ....................................... page 13
  78.  
  79. VI.    Program and Author Information    ............................ page 14
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109. Version 1.0 : 901008
  110.  
  111. COM-AND Script Utility                           Page   1
  112.  
  113.  
  114. I.    Introduction
  115.  
  116.  
  117.     A. What is COM-AND?
  118.  
  119.        COM-AND for the IBM PC and compatibles is a communications pro-
  120.        gram that may be used by itself, or with several integrated
  121.        accessory programs (which themselves may be used independently of
  122.        COM-AND).  COM-AND provides standard comm program functions:  a
  123.        dialing directory, macros, disc logging, binary and ASCII file
  124.        transfers, scripted execution and so on.
  125.  
  126.  
  127.     B. COM-AND scripts
  128.  
  129.        A script automates certain manual tasks, and allows COM-AND to run
  130.        unattended (if the script has been tested (!!!)).  A script is a
  131.        program written to control COM-AND execution.  Scripts distributed
  132.        with COM-AND include:  LEARN mode (a script that writes a script),
  133.        a FILEMGR (perform DOS functions and find files for transmission),
  134.        a BBS, a HOST mode, and many more.
  135.  
  136.  
  137.        Script commands are read by COM-AND from an ASCII file (word pro-
  138.        cessor files are not usually ASCII files (!)).  Programmer's text
  139.        editors and EDLIN (provided with DOS) are be used to create and
  140.        modify a script file.
  141.  
  142.  
  143.  
  144.     C. The CACMP program
  145.  
  146.        CACMP is a diagnostic and preprocessor for COM-AND scripts.    CACMP
  147.        may be used simply to perform syntax and semantic review of a
  148.        COM-AND script, and it may be used to preprocess scripts for COM-
  149.        AND.
  150.  
  151.  
  152.        This document discusses the use of CACMP.EXE.  COM-AND scripts
  153.        and the script language are discussed in the CASCRIPT.DOC doc-
  154.        ument distributed with COM-AND.
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164. Version 1.0 : 901008
  165.  
  166. COM-AND Script Utility                           Page   2
  167.  
  168.  
  169. II.    Running CACMP
  170.  
  171.  
  172.     Generally, CACMP is invoked at the DOS prompt with the command:
  173.  
  174.     -----------------------------------------------------------------
  175.     "d>" CACMP <options> [<infilename> [<outfilename>]]
  176.  
  177.     Where "d>" is the DOS prompt, and
  178.           <options> are [<switch> [<switch> ...]]
  179.     -----------------------------------------------------------------
  180.  
  181.  
  182.     CACMP could be invoked with a command such as:
  183.  
  184.         "d>" CACMP
  185.  
  186.     to simply start CACMP.    In this case, CACMP will prompt for an input
  187.     file and will not write a stripped/preprocessed file.  The command:
  188.  
  189.         "d>" CACMP /s
  190.  
  191.     will cause CACMP to prompt for both an input AND an output file name
  192.     (the input file MUST NOT be the same as the output file).  Output
  193.     will be the input stripped of comments (see below).
  194.  
  195.  
  196.     CACMP by default deletes an output file (if there is one) when a
  197.     syntax error is found.    This action may be inhibited with the switch
  198.     "/k".  In the case:
  199.  
  200.         "d>" CACMP /s/k
  201.  
  202.     the output file will be retained (and lines marked as 'syntax errors'
  203.     will be retained (partially stripped, regardless of preprocessing).
  204.  
  205.  
  206.     The input file name (and output file name) may be specified in the
  207.     run command.  For example:
  208.  
  209.         "d>" CACMP /s bbs.src
  210.  
  211.     will read the file BBS.SRC and prompt for an output file name.    Input
  212.     file names default to the extension ".CMD" if the name given is not
  213.     found.    The output file, if it exists, is deleted and recreated when
  214.     CACMP begins.  For this reason, CACMP must not be run with the same
  215.     file as INPUT and output.
  216.  
  217.  
  218.  
  219. Version 1.0 : 901008
  220.  
  221. COM-AND Script Utility                           Page   3
  222.  
  223.  
  224. II.    Running CACMP (continued)
  225.  
  226.  
  227.     The following switches are defined for CACMP at run-time:
  228.  
  229.         /1        Partial strip output (see below)
  230.         /s        Full strip output (see below)
  231.         /k        Keep output if syntax error is detected
  232.         /p        Preprocess script (for speed)
  233.  
  234.  
  235.     The default settings for CACMP are: no output, and delete output if a
  236.     syntax error is detected.
  237.  
  238.  
  239.     All error and diagnostic output by CACMP is directed to the standard
  240.     output device.    Therefore, the command:
  241.  
  242.         "d>" CACMP >temp script.cmd
  243.  
  244.     records all the diagnostic information in the file TEMP on the cur-
  245.     rent subdirectory, for later review.
  246.  
  247.  
  248.     When CACMP terminates it displays the following summary:
  249.  
  250.         Total input lines:
  251.         Total input statements:
  252.         Total input comments:
  253.         Total input labels:
  254.         Total syntax errors:
  255.         Total semantic warnings:
  256.  
  257.  
  258.     If output was created, CACMP also reports:
  259.  
  260.         Input file size:
  261.         Output file size:
  262.  
  263.  
  264.     CACMP terminates with a DOS error level of 0 if no syntax errors and
  265.     no semantic errors were detected.  CACMP terminates with a DOS error
  266.     level of 1 if either syntax or semantic errors were reported.  [Batch
  267.     checks of a group of scripts may be stopped on an error using the
  268.     error level returned to DOS.]
  269.  
  270.  
  271.  
  272.  
  273.  
  274. Version 1.0 : 901008
  275.  
  276. COM-AND Script Utility                           Page   4
  277.  
  278.  
  279. III.    CACMP functions
  280.  
  281.  
  282.     A. Syntax check
  283.  
  284.  
  285.        CACMP's first function is to syntactically verify each line of the
  286.        input file.    Syntax errors are noted as follows:
  287.  
  288.               Line     3: Syntax error
  289.                S0 = N0+5(N1+ N2)
  290.                     ^
  291.               General parse failure (syntax)
  292.  
  293.  
  294.        The first line records the line number and the error.  The second
  295.        line echoes the input line.    The third line points to the highest
  296.        point the parser reached parsing the line (probably close to the
  297.        point at which the error occurs).  The fourth line adds any addi-
  298.        tional information returned by the parser.
  299.  
  300.  
  301.        Developer's note:  In the fourth line, ANY return except the one
  302.        above should be reported to the author.  The fourth line properly
  303.        may be considered diagnostic to CACMP.  For example, 'Stack
  304.        overflow' at this point indicates that the parser recursed beyond
  305.        its stack - a CACMP problem and not an input problem.
  306.  
  307.  
  308.        All error and diagnostic information listed by CACMP is directed
  309.        to the standard output device.  Therefore, the command:
  310.  
  311.            "d>" CACMP >temp script.cmd
  312.  
  313.        records all CACMP diagnostic information in the file TEMP on the
  314.        current subdirectory, for later review.
  315.  
  316.  
  317.        Syntax errors are counted, and the number reported at CACMP ter-
  318.        mination.  If CACMP was run to strip/preprocess a file and syntax
  319.        errors were detected, the output file is deleted (unless /k in the
  320.        run command was specified).
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329. Version 1.0 : 901008
  330.  
  331. COM-AND Script Utility                           Page   5
  332.  
  333.  
  334. III.    CACMP functions (continued)
  335.  
  336.  
  337.     B. Semantic check
  338.  
  339.  
  340.        Beyond syntactic verification of each line, CACMP follows the
  341.        input file to verify the structure of the script.  Semantic
  342.        verification in CACMP consists of:
  343.  
  344.        1.    Overlapped domains
  345.  
  346.  
  347.         The IF, SWITCH, WHILE, FOR and DO statements imply a 'domain'
  348.         of execution.  The domain of the IF statement extends until
  349.         an ENDIF statement (except in compound IF statements, where a
  350.         single statement to be executed when the condition is true is
  351.         carried on the same line).  The domain of a SWITCH statement
  352.         extends until an ENDSWITCH.  Similarly the WHILE, FOR and DO
  353.         statements domains extend until their respective terminators.
  354.  
  355.         Domains may NOT overlap.  For example, the following
  356.         construction is an overlapped domain:
  357.  
  358.             WHILE N0 LT 5
  359.                   IF N0 EQ 3
  360.                  ENDWHILE
  361.                  GOTO somewhere
  362.                   ENDIF
  363.                   ENDWHILE
  364.  
  365.         [In the above case, the ENDWHILE within the IF domain is
  366.         superfluous (the WHILE loop domain would terminate on the
  367.         GOTO).]  CACMP diagnoses this code as:
  368.  
  369.             Line     3: WARNING: Overlapped domain
  370.                              ENDWHILE
  371.             ^
  372.             .......  Current domain is IF starting:     2
  373.  
  374.         The ENDWHILE on line 3 overlaps the IF domain that began in
  375.         line 2.
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384. Version 1.0 : 901008
  385.  
  386. COM-AND Script Utility                           Page   6
  387.  
  388.  
  389. III.    CACMP functions (continued)
  390.  
  391.  
  392.     B. Semantic check (continued)
  393.  
  394.  
  395.        2.    Incomplete domain
  396.  
  397.  
  398.         On completion of processing, domains left open (i.e. with-
  399.         out closure) are reported as 'incomplete domains' by CACMP.
  400.         For example:
  401.  
  402.             WARNING: Incomplete WHILE domain starting:     1
  403.  
  404.         In this case, a WHILE loop was not properly closed with an
  405.         ENDWHILE.  The WHILE statement is to be found in line 1.
  406.  
  407.  
  408.        3.    Unreachable code
  409.  
  410.  
  411.         The GOTO, RETURN, FRETURN, ACCESSORY, EXECUTE, EXIT, BYE,
  412.         TERMINAL, CONNECT, and QUIT statements are unconditional
  413.         transfers of control.  They do not return.  When one of these
  414.         statements is found OUTSIDE of the domain of an IF, WHILE,
  415.         SWITCH, FOR, or DO statement, CACMP expects to find a label
  416.         as the next executable statement.   If not, CACMP issues the
  417.         following semantic warning:
  418.  
  419.             Line     2: WARNING: Cannot reach this statement
  420.             N0 = N0+1
  421.             ^
  422.  
  423.        4.    Duplicate labels
  424.  
  425.  
  426.         CACMP keeps track of label statements.    When a label dupli-
  427.         cates one previously seen, CACMP issues the warning:
  428.  
  429.             Line     9: WARNING: Duplicate label
  430.             label:
  431.             ^
  432.  
  433.         Note that the label has been truncated to 8 characters.  COM-
  434.         AND only uses the first 8 characters of a label - often the
  435.         root of a duplicate label condition.
  436.  
  437.  
  438.  
  439. Version 1.0 : 901008
  440.  
  441. COM-AND Script Utility                           Page   7
  442.  
  443.  
  444. III.    CACMP functions (continued)
  445.  
  446.  
  447.     B. Semantic check (continued)
  448.  
  449.  
  450.        5.    Undefined labels
  451.  
  452.  
  453.         CACMP also keeps track of label used in GOTO, GOSUB, ON and
  454.         WOPEN statements.  On completion of processing, any label
  455.         referenced by one of these statements but not found in the
  456.         script is reported as 'undefined label'.  For example:
  457.  
  458.             WARNING: Undefined label: SOMEWHER
  459.  
  460.  
  461.        6.    Label in domain    (IF/SWITCH/WHILE/FOR/DO)
  462.  
  463.  
  464.         Above it was noted that a GOTO terminates the 'domain' of an
  465.         IF, SWITCH, WHILE, FOR, and DO statement.  GOTOs may NOT
  466.         transfer control INTO the domain of one of these statements.
  467.         When a label is encountered within a domain, CACMP reports:
  468.  
  469.             Line   8: WARNING: Label in WHILE domain starting:  3
  470.             label:
  471.             ^
  472.  
  473.         It will be noted (painfully), that a single unclosed domain
  474.         (for example, an IF missing its ENDIF) may result in MANY
  475.         'label in domain' warnings.  The clue in this case is that
  476.         all will reference a domain beginning at one line.  Correct
  477.         the unclosed domain, and improper 'label in domain' warnings
  478.         disappear.
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494. Version 1.0 : 901008
  495.  
  496. COM-AND Script Utility                           Page   8
  497.  
  498.  
  499. III.    CACMP functions (continued)
  500.  
  501.  
  502.     B. Semantic check (continued)
  503.  
  504.  
  505.        7.    COM-AND stack overflow
  506.  
  507.  
  508.         COM-AND allows IF, WHILE, SWITCH, FOR and DO statements to
  509.         be nested to a depth of 20.  When CACMP finds a nesting level
  510.         greater than 20 it issues a warning:
  511.  
  512.             WARNING: DO/FOR/IF/SWITCH/WHILE stack overflow
  513.                  WHILE 1 EQ 1
  514.             ^
  515.  
  516.  
  517.        8.    COM-AND stack underflow
  518.  
  519.  
  520.         When an ENDIF, ENDWHILE, ENDSWITCH, ENDFOR or UNTIL statement
  521.         is encountered with no corresponding start-of-domain state-
  522.         ment, CACMP issues the warning:
  523.  
  524.             WARNING: DO/FOR/IF/SWITCH/WHILE stack underflow
  525.                  ENDWHILE
  526.             ^
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549. Version 1.0 : 901008
  550.  
  551. COM-AND Script Utility                           Page   9
  552.  
  553.  
  554. III.    CACMP functions (continued)
  555.  
  556.  
  557.     C. Partial strip
  558.  
  559.  
  560.        When CACMP is run with the /1 switch, records of the input file
  561.        are 'partially stripped' and written to the output file.  Partial
  562.        stripping is similar in function to the STRIPPER.CMD script dis-
  563.        tributed with COM-AND.  Partial stripping consists of:
  564.  
  565.         1) Removal of comment lines
  566.         2) Removal of comments on statement lines
  567.         3) Removal of all blanks at the left of a statement
  568.         4) Reduction of multiple blanks to a single blank
  569.         5) Removal of redundant blanks (e.g. " = " -> "=")
  570.  
  571.  
  572.        The STRIPPER.CMD script only performs function (1) above.  Addi-
  573.        ally, CACMP writes the output file records with only a carriage
  574.        return (not carriage return/line feed), as COM-AND needs only the
  575.        carriage return.
  576.  
  577.  
  578.        A file 'partially stripped' by CACMP will be smaller than one
  579.        stripped by STRIPPER.  The actual reduction in size will be
  580.        determined by the input file, but CACMP necessarily produces a
  581.        smaller file.
  582.  
  583.  
  584.        Please note that once stripped by CACMP, a file may not be 'read-
  585.        able' by the same editor that produced its source.  Some editors
  586.        will tolerate the missing line feed, and some won't.  The popular
  587.        LIST program by Vern Buerg, for example, won't display the file
  588.        (except as a hex dump).
  589.  
  590.  
  591.        Lines marked as 'syntax errors' are written to the output file
  592.        partially stripped.
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604. Version 1.0 : 901008
  605.  
  606. COM-AND Script Utility                           Page  10
  607.  
  608.  
  609. III.    CACMP functions (continued)
  610.  
  611.  
  612.     D. Full Strip
  613.  
  614.  
  615.        When CACMP is run with the /s switch, records of the input file
  616.        are 'fully stripped' and written to the output file.  Full
  617.        stripping includes the functions listed above as 'partial
  618.        stripping', and:
  619.  
  620.         1) Reduction of label lines to an 8 character maximum
  621.         2) Reduction of labels in GOTO, GOSUB, ON and WOPEN
  622.            statements to an 8 character maximum
  623.         3) Reduction of initial keywords in statements to a four
  624.            character maximum.
  625.  
  626.  
  627.        Again, CACMP writes the output file records with only a carriage
  628.        return (not carriage return/line feed) as COM-AND needs only the
  629.        carriage return.
  630.  
  631.  
  632.        A file 'fully stripped' by CACMP will be considerably smaller than
  633.        one stripped by STRIPPER.  The actual reduction in size will be
  634.        determined by the input file.  [Your mileage may vary, contents
  635.        are shipped by weight, not volume...]
  636.  
  637.  
  638.        Lines marked 'syntax errors' are written to the output file, but
  639.        only partially stripped.
  640.  
  641.  
  642.        [Tricky ones in the audience might propose that labels be con-
  643.        verted to numeric equivalents.  After all, "1:" is a legitimate
  644.        label.  However, the COM-AND language supports indirect GOTOs.
  645.        For example, "GOTO S0" will branch to the label in S0 (given that
  646.        S0 contains a valid label name).  Therefore, such a reduction,
  647.        although generally possible, is not supported.]
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659. Version 1.0 : 901008
  660.  
  661. COM-AND Script Utility                           Page  11
  662.  
  663.  
  664. III.    CACMP functions (continued)
  665.  
  666.  
  667.     E. Preprocessing
  668.  
  669.  
  670.        When CACMP is run with the /P switch, records of the input file
  671.        will be 'preprocessed' and written to the output file.  Prepro-
  672.        cessing performs the full strip as described above, and:
  673.  
  674.         .  adds a two byte keyword to each executable line to
  675.            speed COM-AND's execution of the statement
  676.  
  677.  
  678.        Preprocessed scripts are accepted by COM-AND as of its version
  679.        2.7.  The two-byte code added to each executable line speeds the
  680.        interpretor's execution of the statement.  [Author's note: the
  681.        two byte keyword may easily be recognized - the first byte is
  682.        always negative (larger than 127).]
  683.  
  684.  
  685.        A file 'preprocessed' by CACMP will be larger than one stripped
  686.        by CACMP.  It will execute approximately 30% faster than the same
  687.        script stripped by CACMP.  [Please note, preprocessing does not
  688.        have any effect on writes to screen or disc.  It simply speeds
  689.        the interpretation of script statements.]
  690.  
  691.  
  692.        Lines marked 'syntax errors' are written to the output file, but
  693.        only partially stripped.  They are not preprocessed.
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714. Version 1.0 : 901008
  715.  
  716. COM-AND Script Utility                           Page  12
  717.  
  718.  
  719. IV.    CACMP and COM-AND
  720.  
  721.  
  722.     CACMP implements a parser based upon a meta-language specification of
  723.     the COM-AND language.  COM-AND does not - its interpretor parses ad
  724.     hoc (or if you wish, on-the-fly).  The advantages of ad hoc interpre-
  725.     tation are:
  726.  
  727.         1) execution speed, and
  728.         2) simplicity of extension
  729.  
  730.  
  731.     The disadvantage of ad hoc interpretation is that a syntax/semantic
  732.     utility such as CACMP is not possible (not based on the interpretor's
  733.     code, at least).
  734.  
  735.  
  736.     The important point is that CACMP may kick out perfectly valid state-
  737.     ments because its meta-language statement of the language does not
  738.     accommodate a particular construction.    COM-AND executes the state-
  739.     ment happily, but CACMP rejects it.
  740.  
  741.  
  742.     The language syntax implemented is taken from version 2.6 COM-AND
  743.     documentation...  however, COM-AND proper (not its documentation)
  744.     will be the final arbiter of syntax (and documentation adjusted
  745.     accordingly <smile>).
  746.  
  747.  
  748.     If you use this, please save doubtful reports and submit them to the
  749.     developer.  Such reports will be used to further refine CACMP.
  750.  
  751.  
  752.     For the curious, the meta-language implemented here is similar in
  753.     form to the LANGPACK language developed at Bell Labs.  LANGPACK per
  754.     se was not implemented - the modified Backus-Naur form for the meta-
  755.     language was implemented in a lexical compiler created for CACMP.
  756.     The parser implemented uses the lexical compiler's output to
  757.     control text parsing.
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769. Version 1.0 : 901008
  770.  
  771. COM-AND Script Utility                           Page  13
  772.  
  773.  
  774. V.    Program requirements
  775.  
  776.  
  777.     CACMP is written for an IBM PC or DOS compatible machine.  CACMP
  778.     uses DOS and BIOS for all I/O...  no fancy games with screen buffers
  779.     are played.
  780.  
  781.  
  782.     COM-AND disk I/O is done through the 'Handle' oriented I/O routines
  783.     added to DOS 2.0.  Therefore DOS 2.0 is a minimum requirement.
  784.  
  785.  
  786.     CACMP (Version 1.0 ) requires 107K for itself.    You need 256K
  787.     to take advantage of it.
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824. Version 1.0 : 901008
  825.  
  826. COM-AND Script Utility                           Page  14
  827.  
  828.  
  829. VI.    Author information
  830.  
  831.  
  832.     CACMP was written using Microsoft Macro-Assembler.  The author
  833.     likes assembler.  Assembly language is an entirely appropriate
  834.     vehicle for some of the program, and a not-inappropriate vehicle
  835.     for the rest of it.  Everything, in moderation...
  836.  
  837.  
  838.     The author of this program is R. Scott McGinnis of Chicago, IL.
  839.     PLINK and GEnie ID:  TARTAN.  CIS ID:  73147,2665.  Comment and
  840.     suggestions (and criticism in moderation) are welcomed:
  841.  
  842.              CABER Software
  843.              R. (Scott) McGinnis
  844.              P.O. Box 3607 Mdse Mart
  845.              Chicago, IL 60654-0607
  846.  
  847.  
  848.     I thank my wife, Elizabeth, who put up with my obsessing while I
  849.     developed the parser on which CACMP is based.  The meta-language
  850.     specification of a language the size of COM-AND's is an obsessive
  851.     task - writing a compiler to compile the meta-language and a parser
  852.     to execute the compiler's output... the mind is a terrible thing to
  853.     lose.  Elizabeth refreshes this one every day.
  854.  
  855.  
  856.     This program may be distributed freely (but it isn't a whole lot of
  857.     use without COM-AND).  Any problems that are reported to the author
  858.     will get attention.
  859.  
  860.  
  861.     COM-AND is shareware.  If COM-AND is USED after a reasonable period
  862.     of evaluation, a registration of $35.00 is required.  CACMP is
  863.     included in the registration of COM-AND.
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879. Version 1.0 : 901008
  880.